package com.javaee.ex05.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class DynamicProxyFactory implements InvocationHandler{
    // 目标对象:想要被代理的对象
    private Object target;
    // 有参构造方法：将被代理的对象注入到代理类中
    public DynamicProxyFactory(Object target) {
        this.target = target;
    }

    // 返回代理对象
    // 基于反射来得到代理对象
    public Object getProxy() {
        ClassLoader classLoader = target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        // 基于反射来得到代理对象
        return Proxy.newProxyInstance(classLoader, interfaces, this);
    }
    // method是想要被代理的方法，add，sub，mul，div
    // args是被代理方法的入参
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 核心业务之前输出日志
        System.out.println("【JDK动态代理】【日志】" + method.getName() + "，参数：" + Arrays.toString(args));
        // 调用目标方法完成核心业务
        Object result = method.invoke(target, args);
        System.out.println("【JDK动态代理】【日志】" + method.getName() + "，结果：" + result);
        // 核心业务之后输出日志
        return result;
    }
}
